#include "event.h"


typedef void (*function)(void);

static function evt_regs[EVENT_MAX_COUNT] = {0};
static event_t evt_value = 0;
static event_t evt_auto_unregister = 0;

void event_manual_register(event_t evt, void handler())
{
	unsigned char i;

	for (i = 0; i < EVENT_MAX_COUNT; i++)
	{
		if (evt & (((event_t)1) << i))
		{
			evt_regs[i] = handler;
			evt_auto_unregister &= ~(((event_t)1) << i);
		}
	}
}

event_t event_auto_register(void handler(), unsigned char auto_unregister)
{
	unsigned char i;
	event_t evt;

	for (i = 0; i < EVENT_MAX_COUNT; i++)
	{
		evt = ((event_t)1) << i;
		if (evt_regs[i] == 0)
		{
			evt_regs[i] = handler;
			if (auto_unregister)
			{
				evt_auto_unregister |= evt;
			}
			else
			{
				evt_auto_unregister &= ~evt;
			}
			break;
		}
	}
	return (i < EVENT_MAX_COUNT) ? evt : 0;
}


event_t event_get()
{
	return evt_value;
}

void event_post(event_t evt)
{
	evt_value |= (evt);
}

void event_cancel(event_t evt)
{
	evt_value &= ~(evt);
}

void event_clear()
{
	evt_value = (event_t)0;
}


void event_pull()
{
	unsigned char i;
	event_t evt;

	if (evt_value)
	{
		for (i = 0; i < EVENT_MAX_COUNT; i++)
		{
			evt = ((event_t)1) << i;
			if (evt_value & evt)
			{
				evt_value &= ~evt;
				if (evt_regs[i])
				{
					evt_regs[i]();
				}
				if (evt_auto_unregister & evt)
				{
					evt_auto_unregister &= ~evt;
					evt_regs[i] = 0;
				}
			}
		}
	}
}
